#!/usr/bin/env python
# -*- coding: utf-8 -*-
__author__ = 'Ascotbe'
import urllib3
from ClassCongregation import VulnerabilityDetails,UrlProcessing,ErrorLog,WriteFile,Proxies,ErrorHandling
import socket
import struct
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
class VulnerabilityInfo(object):
    def __init__(self,Medusa):
        self.info = {}
        self.info['number']="CVE-2020-0796" #如果没有CVE或者CNVD编号就填0，CVE编号优先级大于CNVD
        self.info['author'] = "Ascotbe"  # 插件作者
        self.info['create_date'] = "2020-3-16"  # 插件编辑时间
        self.info['disclosure'] = '2019-3-12'  # 漏洞披露时间，如果不知道就写编写插件的时间
        self.info['algroup'] = "WindowsSMBv3ProtocolVulnerability"  # 插件名称
        self.info['name'] ='WindowsSMBv3协议漏洞' #漏洞名称
        self.info['affects'] = "Windows"  # 漏洞组件
        self.info['desc_content'] = "微软SMBv3协议的内存破坏漏洞，该漏洞无需授权验证即可被远程利用，可能形成蠕虫级漏洞"  # 漏洞描述
        self.info['rank'] = "高危"  # 漏洞等级
        self.info['version'] = "Windows10Version1903for32-bitSystems\r\nWindows10Version1903forx64-basedSystems\r\nWindows10Version1903forARM64-basedSystems\r\nWindowsServer,version1903(Server Core installation)\r\nWindows10Version1909for32-bitSystems\r\nWindows10Version1909forx64-basedSystems\r\nWindows10Version1909forARM64-basedSystems\r\nWindowsServer,version1909(Server Core installation)"  # 这边填漏洞影响的版本
        self.info['suggest'] = "升级最新Harbor版本"  # 修复建议
        self.info['details'] = Medusa  # 结果


def medusa(Url:str,Headers:dict,proxies:str=None,**kwargs)->None:
    proxies=Proxies().result(proxies)
    scheme, url, port = UrlProcessing().result(Url)
    try:
        payload =  b'\x00\x00\x00\xc0\xfeSMB@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00$\x00\x08\x00\x01\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00x\x00\x00\x00\x02\x00\x00\x00\x02\x02\x10\x02"\x02$\x02\x00\x03\x02\x03\x10\x03\x11\x03\x00\x00\x00\x00\x01\x00&\x00\x00\x00\x00\x00\x01\x00 \x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\n\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00'

        sock = socket.socket(socket.AF_INET)
        sock.settimeout(3)
        ip = socket.gethostbyname(url)
        sock.connect((ip, 445))
        sock.send(payload)
        nb, = struct.unpack(">I", sock.recv(4))
        res = sock.recv(nb)

        if (not res[68:70] == b"\x11\x03") or (not res[70:72] == b"\x02\x00"):
            pass
        else:
            Medusa = "{}存在WindowsSMBv3协议漏洞(CVE-2020-0796)\r\n验证数据:\r\n返回值:{}\r\nIP值:{}\r\n".format(url,res,ip)
            _t = VulnerabilityInfo(Medusa)
            VulnerabilityDetails(_t.info, url,**kwargs).Write()  # 传入url和扫描到的数据
            WriteFile().result(str(url),str(Medusa))#写入文件，url为目标文件名统一传入，Medusa为结果
    except Exception as e:
        _ = VulnerabilityInfo('').info.get('algroup')
        ErrorHandling().Outlier(e, _)
        _l = ErrorLog().Write("Plugin Name:"+_+" || Target Url:"+url,e)#调用写入类

